Los patrones Strategy y Template Method nos permiten definir la estructura base de un algoritmo y despues realizar modificaciones en las partes que nosotros consideremos mas variables de dicho algoritmo.
Template Method consigue esto a traves de herencia, mientras que Strategy lo consigue a traves de delegación
El ejemplo consiste en un algoritmo que recibe un numero y le suma uno (esta es la parte comun del algoritmo), despues la parte variable es la validación para saber si cumple las condiciones para "ser mágico", tenemos una validación Alpha que decide si es mágico en caso de ser par y estar entre 10 y 20, y una validación Beta que decide si es mágico en caso de ser impar.
public class StrategyApp {
public static void main(String[] args) {
ValidadorAlpha validadorAlpha = new ValidadorAlpha();
ValidadorBeta validadorBeta = new ValidadorBeta();
NumeroMagico numeroMagicoAlpha = new NumeroMagico(validadorAlpha);
NumeroMagico numeroMagicoBeta = new NumeroMagico(validadorBeta);
numeroMagicoAlpha.setNumero(12);
numeroMagicoBeta.setNumero(12);
printMagic(numeroMagicoAlpha, "Alpha");
printMagic(numeroMagicoBeta, "Beta");
}
public static void printMagic(NumeroMagico numeroMagico, String nombre){
if(numeroMagico.check())
System.out.println(nombre + " es magico");
else
System.out.println(nombre + " no magic");
}
}
public class NumeroMagico {
private int numero;
private ValidacionHandler validador;
public NumeroMagico(ValidacionHandler validador){
this.validador = validador;
}
public void setNumero(int numero){
this.numero = numero;
}
public boolean check(){
int numeroMagico = numero + 1;
return validador.esMagico(numeroMagico);
}
}
public interface ValidacionHandler {
boolean esMagico(int numero);
}
public class ValidadorAlpha implements ValidacionHandler{
@Override
public boolean esMagico(int numero) {
return esPar(numero) && esRango10a20(numero);
}
public boolean esPar(int numero) {
return numero % 2 == 0;
}
public boolean esRango10a20(int numero) {
return numero > 10 && numero < 20;
}
}
public class ValidadorBeta implements ValidacionHandler{
@Override
public boolean esMagico(int numero) {
return esImpar(numero);
}
public boolean esImpar(int numero) {
return numero % 2 != 0;
}
}
public class TemplateMethodApp {
public static void main(String[] args) {
NumeroMagico numeroMagicoAlpha = new ValidadorAlpha();
NumeroMagico numeroMagicoBeta = new ValidadorBeta();
numeroMagicoAlpha.setNumero(15);
numeroMagicoBeta.setNumero(15);
printMagic(numeroMagicoAlpha, "Alpha");
printMagic(numeroMagicoBeta, "Beta");
}
public static void printMagic(NumeroMagico numeroMagico, String nombre){
if(numeroMagico.check())
System.out.println(nombre + " es magico");
else
System.out.println(nombre + " no magic");
}
}
public abstract class NumeroMagico {
private int numero;
public void setNumero(int numero){
this.numero = numero;
}
public boolean check(){
int numeroMagico = numero + 1;
return esMagico(numeroMagico);
}
abstract boolean esMagico(int numero);
}
public class ValidadorAlpha extends NumeroMagico{
@Override
public boolean esMagico(int numero) {
return esPar(numero) && esRango10a20(numero);
}
public boolean esPar(int numero) {
return numero % 2 == 0;
}
public boolean esRango10a20(int numero) {
return numero > 10 && numero < 20;
}
}
public class ValidadorBeta extends NumeroMagico{
@Override
public boolean esMagico(int numero) {
return esImpar(numero);
}
public boolean esImpar(int numero) {
return numero % 2 != 0;
}
}
Design Patterns | Strategy | Template Method